package ufmg.maze;

import java.util.Vector;

import ufmg.maze.ga.Individuo;

public class Maze {

	// remove paredes cima, baixo, esquerda, direita
	private Vector<Vector<Integer>> maze;

	private int inicial_coluna; // comecando em 1
	private int inicial_linha; // comecando em 0

	private int saida_coluna; // comecando em 1
	private int saida_linha; // comecando em 0

	public static final int MAZE_VAZIO = 0;
	public static final int MAZE_PAREDE = 1;
	public static final int MAZE_MAIS = 7;

	private int tamanho; // casas livres do maze

	public Maze() {
		this.maze = new Vector<Vector<Integer>>();
	}

	public void addLinhaCorredor(String[] linha) {
		int colunaCountOriginal = 0;

		Vector<Integer> mazeLinha = new Vector<Integer>();
		for (String token : linha) {
			if (token.length() > 0) {

				int posicao = token.indexOf("S");
				if (posicao > -1) {
					inicial_coluna = colunaCountOriginal + 2
							* ((posicao - 1) / 4 + 1) - 1;
					inicial_coluna--;

					inicial_linha = maze.size() - 1;

					System.out.println("Inicial: " + inicial_linha + ","
							+ inicial_coluna);
				}

				posicao = token.indexOf("E");
				if (posicao > -1) {
					saida_coluna = colunaCountOriginal + 2
							* ((posicao - 1) / 4 + 1) - 1;
					saida_coluna--;
					saida_linha = maze.size() - 1;
					System.out.println("Final: " + saida_linha + ","
							+ saida_coluna);
				}

				int corredorSize = 1 + ((token.length() - 3) / 4);
				// tamanho += corredorSize;

				// System.out.println("#" + token + "#" + corredorSize);
				for (int i = 0; i < corredorSize; i++) {
					tamanho++;
					mazeLinha.add(MAZE_VAZIO);
					colunaCountOriginal++;
					if (i < corredorSize - 1) {
						mazeLinha.add(MAZE_MAIS);
						colunaCountOriginal++;
					}
				}
				mazeLinha.add(MAZE_PAREDE);
				colunaCountOriginal++;
				// System.out.println(colunaCountOriginal);
			}
		}
		mazeLinha.remove(mazeLinha.size() - 1);
		maze.add(mazeLinha);
	}

	public void addLinhaParede(String[] linha) {
		Vector<Integer> mazeLinha = new Vector<Integer>();

		for (String token : linha) {
			if (token.length() > 0) {
				int posicao = token.indexOf("-");
				if (posicao > -1) {
					mazeLinha.add(MAZE_PAREDE);
				} else {
					mazeLinha.add(MAZE_VAZIO);
				}
				mazeLinha.add(MAZE_MAIS);
			}
		}
		maze.add(mazeLinha);
		mazeLinha.remove(mazeLinha.size() - 1);
	}

	public void clean() {
		maze.remove(maze.size() - 1);
		maze.remove(0);
	}

	public int getLimiteX() {
		return maze.get(0).size();
	}

	public int getLimiteY() {
		return maze.size();
	}

	public int getTamanho() {
		return tamanho;
	}

	public void print() {
		for (int i = 0; i < maze.size(); i++) {
			Vector<Integer> linha = maze.get(i);
			for (Integer value : linha) {
				System.out.print(value);
			}
			System.out.println();
		}
	}

	public int getInicialColuna() {
		return inicial_coluna;
	}

	public int getInicialLinha() {
		return inicial_linha;
	}

	public int getSaidaColuna() {
		return saida_coluna;
	}

	public int getSaidaLinha() {
		return saida_linha;
	}

	public boolean isValidMove(int i, int j, int movimento) {
		if ((i >= 0 && i < this.maze.size())
				&& (j >= 0 && j < this.maze.get(0).size())) {
			switch (movimento) {
			case Individuo.NORTE:
				if (i - 2 >= 0) {
					if (maze.get(i - 1).get(j) != MAZE_PAREDE) {
						return true;
					}
				}
				break;
			case Individuo.SUL:
				if (i + 2 <= this.maze.size()) {
					if (maze.get(i + 1).get(j) != MAZE_PAREDE) {
						return true;
					}
				}
				break;
			case Individuo.LESTE:
				if (j + 2 <= this.maze.get(0).size()) {
					if (maze.get(i).get(j + 1) != MAZE_PAREDE) {
						return true;
					}
				}
				break;
			case Individuo.OESTE:
				if (j - 2 >= 0) {
					if (maze.get(i).get(j - 1) != MAZE_PAREDE) {
						return true;
					}
				}
				break;
			}
		}

		return false;
	}
}
